package org.usmile.algorithms.leetcode.simple;

/**
 * 941. 有效的山脉数组
 *
 * 给定一个整数数组 arr，如果它是有效的山脉数组就返回 true，否则返回 false。
 *
 * 让我们回顾一下，如果 arr 满足下述条件，那么它是一个山脉数组：
 *
 * arr.length >= 3
 * 在 0 < i < arr.length - 1 条件下，存在 i 使得：
 * arr[0] < arr[1] < ... arr[i-1] < arr[i]
 * arr[i] > arr[i+1] > ... > arr[arr.length - 1]
 *
 * 示例 1：
 *
 * 输入：arr = [2,1]
 * 输出：false
 * 示例 2：
 *
 * 输入：arr = [3,5,5]
 * 输出：false
 * 示例 3：
 *
 * 输入：arr = [0,3,2,1]
 * 输出：true
 *
 *
 * 提示：
 *
 * 1 <= arr.length <= 104
 * 0 <= arr[i] <= 104
 */
public class _0941 {
}

class _0941_Solution {
    public boolean validMountainArray(int[] arr) {
        if (arr.length <= 1) {
            return false;
        }

        int topIndex = 0;
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] == arr[i - 1]) {
                return false;
            }

            if (arr[i] < arr[i - 1]) {
                topIndex = i - 1;

                break;
            }
        }

        if (topIndex == 0) {
            return false;
        }

        for (int i = topIndex; i < arr.length - 1; i++) {
            if (arr[i] <= arr[i + 1]) {
                return false;
            }
        }

        return true;
    }
}


class _0941_Solution2 {
    public boolean validMountainArray(int[] arr) {
        int i = 0;
        // 1. 找到最高点
        // bug 修复：i = n - 1 的话，数组会越界
        while (i < arr.length - 1 && arr[i] < arr[i + 1]) {
            i++;
        }

        // 2. 判断：最高点不能是第一个和最后一个元素
        if (i == 0 || i == arr.length - 1) {
            return false;
        }

        // 3. 从最高点往后递减扫描
        while (i < arr.length - 1 && arr[i] > arr[i + 1]) {
            i++;
        }

        // 4. 如果 i 指向数组最后一个元素，则返回 true，否则返回 false
        return i == arr.length - 1;
    }
}